Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_ringtone_manager.py

Displaying Raw • Download


tests/backend/test_ringtone_manager.py v4.5.0-rc.2 (1394a44a) Text, 2.73 KB

T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Tests for :mod:`meshchatx.src.backend.ringtone_manager`.

The manager performs conversion in-process via ``audio_codec``
(miniaudio + LXST). These tests pin the contract that
``convert_to_ringtone`` decodes any supported audio container and
produces a stored OGG/Opus ringtone.
"""

Tff7b72import T7ee787io
Tff7b72import T7ee787math
Tff7b72import T7ee787os
Tff7b72import T7ee787struct
Tff7b72import T7ee787wave
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch

Tff7b72import T7ee787pytest

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787ringtone_manager Tff7b72import Te6edf3RingtoneManager


Tff7b72def Td2a8ff_build_wav_pcm16Tb4b4b4(Te6edf3duration_secondsTb4b4b4: Tffa657float Tff7b72= T79c0ff0.4Tb4b4b4, Te6edf3samplerateTb4b4b4: Tffa657int Tff7b72= T79c0ff48000Tb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
Te6edf3n_samples Tff7b72= Tffa657intTb4b4b4(Te6edf3samplerate Tff7b72* Te6edf3duration_secondsTb4b4b4)
Te6edf3buf Tff7b72= Te6edf3ioTff7b72.Td2a8ffBytesIOTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3waveTff7b72.Td2a8ffopenTb4b4b4(Te6edf3bufTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3wfTb4b4b4:
Te6edf3wfTff7b72.Td2a8ffsetnchannelsTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3wfTff7b72.Td2a8ffsetsampwidthTb4b4b4(T79c0ff2Tb4b4b4)
Te6edf3wfTff7b72.Td2a8ffsetframerateTb4b4b4(Te6edf3samplerateTb4b4b4)
Te6edf3frames Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Te6edf3n_samplesTb4b4b4)Tb4b4b4:
Te6edf3sample Tff7b72= Tffa657intTb4b4b4(T79c0ff0.3 Tff7b72* T79c0ff32767 Tff7b72* Te6edf3mathTff7b72.Td2a8ffsinTb4b4b4(T79c0ff2 Tff7b72* Te6edf3mathTff7b72.Td2a8ffpi Tff7b72* T79c0ff440.0 Tff7b72* Tb4b4b4(Te6edf3i Tff7b72/ Te6edf3samplerateTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3framesTff7b72.Td2a8ffextendTb4b4b4(Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff<hTa5d6ff"Tb4b4b4, Te6edf3sampleTb4b4b4)Tb4b4b4)
Te6edf3wfTff7b72.Td2a8ffwriteframesTb4b4b4(Tffa657bytesTb4b4b4(Te6edf3framesTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3bufTff7b72.Td2a8ffgetvalueTb4b4b4(Tb4b4b4)


Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffmanagerTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3RingtoneManagerTb4b4b4(Te6edf3configTb4b4b4, Tffa657strTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4)


Tff7b72def Td2a8fftest_init_creates_storage_dirTb4b4b4(Te6edf3managerTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3managerTff7b72.Td2a8ffstorage_dirTb4b4b4)
Tff7b72assert Te6edf3managerTff7b72.Td2a8ffstorage_dir Tff7b72== Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tffa657strTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffringtonesTa5d6ff"Tb4b4b4)


Tff7b72def Td2a8fftest_convert_to_ringtone_writes_ogg_opusTb4b4b4(Te6edf3managerTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3src Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffinput.wavTa5d6ff"
Te6edf3srcTff7b72.Td2a8ffwrite_bytesTb4b4b4(Te6edf3_build_wav_pcm16Tb4b4b4(Tb4b4b4)Tb4b4b4)

Te6edf3filename Tff7b72= Te6edf3managerTff7b72.Td2a8ffconvert_to_ringtoneTb4b4b4(Tffa657strTb4b4b4(Te6edf3srcTb4b4b4)Tb4b4b4)

Tff7b72assert Te6edf3filenameTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ff.opusTa5d6ff"Tb4b4b4)
Te6edf3out_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3managerTff7b72.Td2a8ffstorage_dirTb4b4b4, Te6edf3filenameTb4b4b4)
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3out_pathTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3out_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Tff7b72assert Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(T79c0ff4Tb4b4b4) Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffOggSTa5d6ff"


Tff7b72def Td2a8fftest_convert_to_ringtone_uses_audio_codecTb4b4b4(Te6edf3managerTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3src Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffinput.wavTa5d6ff"
Te6edf3srcTff7b72.Td2a8ffwrite_bytesTb4b4b4(Te6edf3_build_wav_pcm16Tb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.ringtone_manager.encode_audio_to_ogg_opusTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Ta5d6ff"Ta5d6ffignoredTa5d6ff"Tb4b4b4,
Tb4b4b4) Tff7b72as Te6edf3mock_encodeTb4b4b4:
Te6edf3filename Tff7b72= Te6edf3managerTff7b72.Td2a8ffconvert_to_ringtoneTb4b4b4(Tffa657strTb4b4b4(Te6edf3srcTb4b4b4)Tb4b4b4)
Te6edf3mock_encodeTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Te6edf3argsTb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_encodeTff7b72.Td2a8ffcall_args
Tff7b72assert Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Tffa657strTb4b4b4(Te6edf3srcTb4b4b4)
Tff7b72assert Te6edf3argsTb4b4b4[T79c0ff1Tb4b4b4]Tff7b72.Td2a8ffendswithTb4b4b4(Te6edf3filenameTb4b4b4)


Tff7b72def Td2a8fftest_remove_ringtone_deletes_fileTb4b4b4(Te6edf3managerTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3src Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffinput.wavTa5d6ff"
Te6edf3srcTff7b72.Td2a8ffwrite_bytesTb4b4b4(Te6edf3_build_wav_pcm16Tb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3filename Tff7b72= Te6edf3managerTff7b72.Td2a8ffconvert_to_ringtoneTb4b4b4(Tffa657strTb4b4b4(Te6edf3srcTb4b4b4)Tb4b4b4)
Te6edf3out_path Tff7b72= Te6edf3managerTff7b72.Td2a8ffget_ringtone_pathTb4b4b4(Te6edf3filenameTb4b4b4)
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3out_pathTb4b4b4)
Tff7b72assert Te6edf3managerTff7b72.Td2a8ffremove_ringtoneTb4b4b4(Te6edf3filenameTb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3out_pathTb4b4b4)


Tff7b72def Td2a8fftest_remove_ringtone_missing_returns_trueTb4b4b4(Te6edf3managerTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3managerTff7b72.Td2a8ffremove_ringtoneTb4b4b4(Ta5d6ff"Ta5d6ffdoes-not-exist.opusTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72True


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────